S3 へアップロードしたファイルのサイズが大きいときに Lambda へのイベント通知が送信されない場合の対処方法
困っていた内容
S3 バケットにオブジェクトをアップロードした際に、そのイベントをトリガーにして Lambda 関数を起動させる設定をしています。
アップロードしたファイルのサイズが大きいときに Lambda へのイベント通知が送信されない事象が発生しています。対処方法を教えてください。
どう対応すればいいの?
S3 イベント通知にてイベントタイプ「完了したマルチパートアップロード」の設定を追加してください。
S3 コンソールよりバケットを選択 > プロパティタブをクリック > イベント通知の編集 から変更が可能です。
S3 へファイルサイズの小さいものがアップロードされた場合は、s3:ObjectCreated:Put
イベントが、
ファイルサイズの大きいものがアップロードされた場合は、s3:ObjectCreated:CompleteMultipartUpload
イベントがトリガーされるために事象が発生しています。
※ マルチパートアップロードについては AWS ドキュメント をご参照ください。
試してみる(環境設定)
S3 コンソールと AWS CLI でファイルをいくつかアップロードしていき、どのファイルサイズからそれぞれマルチパートアップロードが実行されるかを検証します。
チュートリアル: Amazon S3 トリガーを使用して Lambda 関数を呼び出す を参考に S3 バケットと Lambda を作成します。
チュートリアルの通りに作成すると、「完了したマルチパートアップロード」を含む「すべてのオブジェクト作成イベント」が S3 バケットで発生した際に Lambda へイベント通知が行われる設定となります。
今回はテストのため、S3 コンソールより対象バケットのイベント通知を編集し、あえて「完了したマルチパートアップロード」イベントの選択を外して設定を保存します。
約 50 KBのファイルをバケットにアップロードする
S3 コンソール
まずは S3 コンソールより、約 50 KB の jpeg ファイルを対象バケットにアップロードします。
問題なく Lambda に通知が行われ、CloudWatch Logs にログが出力されました。
AWS CLI
次に AWS CLI から cp コマンドで同じファイルを対象バケットにアップロードします。
※ 同じファイルですがオブジェクト名を「dogo2.jpg」に変更しています。
$ aws s3 cp dogo.jpg s3://test-20210912-lambda/dogo2.jpg upload: dogo.jpg to s3://test-20210912-lambda/dogo2.jpg
アップロードが完了しました。
こちらも問題なく Lambda に通知が行われ、CloudWatch Logs にログが出力されました。
約 9 MBのファイルをバケットにアップロードする
S3 コンソール
S3 コンソールより、約 9 MB の Keynote プレゼンテーションファイルを対象バケットにアップロードします。
問題なく Lambda に通知が行われ、CloudWatch Logs にログが出力されました。
AWS CLI
次に AWS CLI から cp コマンドで同じファイルを対象バケットにアップロードします。
※ 同じファイルですがオブジェクト名を「Docker2.key」に変更しています。
$ aws s3 cp Docker.key s3://test-20210912-lambda/Docker2.key upload: Docker.key to s3://test-20210912-lambda/Docker2.key
アップロードが完了しました。
しかし、Lambda に通知が行われず、CloudWatch Logs にログが出力されませんでした。
AWS CLI でマルチパートアップロードが実行されるファイルサイズ
AWS CLI でのアップロード時にファイルが 8 MB 以上のファイルサイズである場合にマルチパートアップロードが実行されるとのことです。
multipart_threshold
Default - 8MB
When uploading, downloading, or copying a file, the S3 commands will switch to multipart operations if the file reaches a given size threshold.
約 17 MBのファイルをバケットにアップロードする
S3 コンソール
S3 コンソールより、約 17 MB の PDF ファイルを対象バケットにアップロードします。
しかし、この場合は Lambda に通知が行われず、CloudWatch Logs にログが出力されませんでした。
S3 コンソールでマルチパートアップロードが実行されるファイルサイズ
検証を行ったところ、15.6 MB のファイルの場合は Lambda へ問題なく通知が行われました。
そのため、S3 コンソールからのアップロードの場合は 15.7~16.8 MB あたりからマルチパートアップロードが実行されるかと思います。
追記(2024年5月5日)
検証を行なったところ、Transfer Familly を使用して SFTP で S3 へのファイルのアップロードを実施する場合は、約 6 MBからマルチパートアップロードが実行されるようです。